perm filename III.FAI[VV,BGB] blob sn#133450 filedate 1974-12-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE III    - III DISPLAY SUBROUTINES - BGB - JANUARY 1973.
C00003 00003	SUBR(DPYSET,BUFFER)		INITIALIZE A DISPLAY BUFFER.
C00005 00004	SUBRS AVECT,AIVECT,RVECT,RIVECT	Vectors
C00007 00005	SUBR(DPYSTR,TEXT)
C00010 00006	SUBRS OCTDPY,DECDPY,FLODPY	Numeric display
C00013 ENDMK
C⊗;
TITLE III    - III DISPLAY SUBROUTINES - BGB - JANUARY 1973.
	.INSERT M
DPYBUF↑: .+2 ↔ =2000 ↔ BLOCK =2000

IGNORE:		0
SIZBRT:		0
DPYCOL:		0
DPYPTR↑:	0
BUFEND:		0
BUFHD:		0↔0		;UPG ARGUMENT. ;ADDRESS ↔ LENGTH.

;VERNIER III TEXT POSITIONING.
	VERNX ←← 14
	VERNY ←← 11

;DISPLAY SAIL STRING.
DPYSST↑: POP 16,1↔POP 16,2↔SKIPGE IGNORE↔POPJ P,
	HRRZS 2			;LENGTH	OF STRING.
	JUMPLE 2,SSRET
	ILDB 3,1
	IDPB 3,DPYPTR
	SOJG 2,.-2
SSRET:	HRRZ 1,DPYPTR
	CAML 1,BUFEND
	SETOM IGNORE
	POPJ P,
SUBR(DPYSET,BUFFER)		;INITIALIZE A DISPLAY BUFFER.
COMMENT .-----------------------------------------------------------.
	A←←1
	ACCUMULATORS{B,C}
	LAC 1,BUFFER↔CDR 2,-1(1)	;BUFFER SIZE.
	ADDI 2,-1(1)↔DAC 2,BUFEND
	ADDI 1,2↔DAC 1,BUFHD		;POINT TO THIRD WORD.
	SETZM IGNORE
	SETZM SIZBRT
CLR2:	LAC A,BUFHD			;BLIT III-TEXT OPCODE-1 THRU THE BUFFER.
	MOVEI B,1↔DAC B,1(A)
	MOVEI B,2(A)↔HRLI B,1(A)
	BLT B,@BUFEND
	PUSH P,(P)↔GO LV3
ENDR DPYSET;---------------------------------------------------------

SUBR(DPYBIG,SIZE)	;SET CHARACTER SIZE.
COMMENT .-----------------------------------------------------------.
	LAC SIZE
	DPB [POINT 3,SIZBRT,27]		;REMEMBER NEW SIZE
	POP1J
ENDR DPYBIG;---------------------------------------------------------

SUBR(DPYBRT,SIZE)	;SET BRIGHTNESS.
COMMENT .-----------------------------------------------------------.
	LAC SIZE
	DPB [POINT 3,SIZBRT,24]	;REMEMBER NEW BRIGHTNESS
	POP1J
ENDR DPYBRT;---------------------------------------------------------
;SUBRS AVECT,AIVECT,RVECT,RIVECT	;Vectors
COMMENT ⊗
	TEXT DISPLAY WORD:	 ASCII/ABCDE/ + 1
	LONG VECTOR  WORD:  BYTE(11)X,Y(3)BRT,SIZ(7)OPCODE ⊗

	SUBR(RIVECT)
		GO RIV.	↔ENDR RIVECT
	SUBR(RVECT)
		GO RV.	↔ENDR RVECT
	SUBR(AIVECT)
		GO AIV.	↔ENDR AIVECT
	SUBR(AVECT)
		GO AV.	↔ENDR AVECT

;USES AC 1-3
;DTYO DEPENDS ON THIS
RIV.:	SKIPA  3,[046]		;RELATIVE INVISIBLE VECTOR.
RV.:	MOVEI  3, 006 ↔GO LV0	;RELATIVE   VISIBLE VECTOR.
AIV.:	SKIPA  3,[146]		;ABSOLUTE INVISIBLE VECTOR.
AV.:	MOVEI  3, 106		;ABSOLUTE   VISIBLE VECTOR.
	SETZM DPYCOL		;RESET TAB LOCATION

LV0:	SKIPGE IGNORE↔POP2J
LV:	LAC 1,-2(P)↔LAC 2,-1(P)		;PICKUP X AND Y.
LVC:	DPB 1,[POINT 11,3,10]		;PACK X INTO III-WORD.
	DPB 2,[POINT 11,3,21]		;PACK Y INTO III-WORD.
	SKIPE 1,SIZBRT			;NEW BRIGHTNESS OR SIZE?
	GO [ IOR 3,1↔SETZM SIZBRT↔GO LV2]	;YES, SET IT
LV2:	AOS 1,DPYPTR↔DAC 3,(1)		;PACK WORD INTO III-BUFFER.
LV3:	HRLI 1,<(<POINT 7,0,35>)>	;UPDATE DPYPTR...
	DAC 1,DPYPTR↔MOVEI 1,(1)		;WHICH IS A BYTE-POINTER.
	CAML 1,BUFEND↔SETOM IGNORE	;CHECK FOR BUFFER OVERFLOW.
	POP2J
SUBR(DPYSTR,TEXT)
COMMENT .-----------------------------------------------------------.
;USES AC 1,3
	SKIPE IGNORE↔POP1J
	LAC 3,TEXT↔HRLI 3,440700
L1:	ILDB 3↔JUMPE POP1J.
	CALL(DTYO,0)↔GO L1
ENDR DPYSTR;---------------------------------------------------------

SUBR(DTYO,CHAR)
COMMENT .-----------------------------------------------------------.
;USES AC 1
;DPYSTR DEPENDS ON DTYO NOT CLOBBERING 3
	SKIPE IGNORE↔POP1J
	SKIPE SIZBRT
	GO [ PUSHP 0↔PUSHP 2↔PUSHP 3
	     CALL(RIVECT,[0],[0])
	     POPP 3↔POPP 2↔POPP 0
	     GO .+1]
	LAC 1,CHAR
	CAIN 1,15↔SETOM DPYCOL
	CAIN 1,11↔GO DOTAB
DTYO1:	IDPB 1,DPYPTR↔AOS DPYCOL
	CDR 1,DPYPTR↔CAML 1,BUFEND
	SETOM IGNORE↔POP1J
DOTAB:	CALL(DTYO,[" "])	;We got a tab, put out spaces until
	LAC 1,DPYCOL		;column is divisible by 8
	TRNE 1,7↔GO DOTAB
	CDR 1,DPYPTR
	POP1J
ENDR DTYO;-----------------------------------------------------------

SUBR(DPYOUT,POG)
COMMENT .-----------------------------------------------------------.
	A←←1
	ACCUMULATORS{B,C}
	SKIPN A,BUFHD↔GO L1
	LAC 2,DPYPTR↔DAC 2,-2(1)
	MOVEI 2,2(2)↔SUB 2,1↔DAC 2,-1(1)

L1:	CDR B,DPYPTR↔SUB B,BUFHD		;BUFFER LENGTH.
	AOS B↔DAC B,BUFHD+1

	MOVM A,POG↔DPB A,[POINT 4,UPGOP,12]	;GLASS TO AC FIELD.
UPGOP:	703B8+BUFHD
	JFCL
	POP1J
ENDR DPYOUT;---------------------------------------------------------
;SUBRS OCTDPY,DECDPY,FLODPY	;Numeric display
;--------------------------------------------------------------------
SUBR(OCTDPY,INTEGER)	;OCTAL NUMBER DISPLAY.
	Q←15 ↔ N←13
	JFCL↔GO L2
	LAC 14,INTEGER↔LAC Q,[POINT 3,14,-1]↔MOVEI N,6
L1:	ILDB Q↔IORI 60↔CALL(DTYO,0)↔SOJG N,L1
	CALL(DTYO,[" "])
L2:	LAC 14,INTEGER↔LAC Q,[POINT 3,14,17]↔MOVEI N,6
L3:	ILDB Q↔IORI 60↔CALL(DTYO,0)↔SOJG N,L3
	POP1J
ENDR OCTDPY;3/25/73(BGB)---------------------------------------------

DECDPY↑:;(INTEGER)	;DECIMAL NUMBER DISPLAY.
BEGIN DECDPY
	LAC 1,-1(P)↔POP P,-1(P)		;FETCH ARG AND LAC RET. ADR.
L1:	JUMPGE 1,L2			;TEST FOR NEGATIVE NUMBER.
	MOVM 2,1↔CALL(DTYO,["-"])	;PRINT MINUS SIGN.
	LAC 1,2
L2:	IDIVI 1,12↔PUSH P,2		;MODULO TEN AND SAVE.
	SKIPE 1↔PUSHJ P,L2		;TEST FOR DONE.
	POP P,1↔ADDI 1,60↔CALL(DTYO,1)	;RESTORE & PRINT.
	POPJ P,
BEND DECDPY;12/17/72(BGB)--------------------------------------------

SUBR(FLODPY,FLONUM,PLACES)	;FLOATING NUMBER DISPLAY.
	LAC FLONUM
	JUMPL[CALL(DTYO,["-"])↔MOVM FLONUM↔GO .+1]
	MOVM 2,PLACES↔CAILE 2,6↔MOVEI 2,6↔DAC 2,PLACES
	FMPR[1.↔10.↔100.↔1000.↔10000.↔100000.↔1000000.](2)↔FIXX
	IDIV[=1↔=10↔=100↔=1000↔=10000↔=100000↔=1000000](2)
	PUSHP 1↔CALL(DECDPY,0)↔POPP 0
	LAC 2,PLACES
	ADD[=1↔=10↔=100↔=1000↔=10000↔=100000↔=1000000](2)
	PUSHP DPYPTR↔CALL(DECDPY,0)↔POPP 1
	MOVEI "."↔IDPB 0,1
	POP2J
ENDR FLODPY;12/17/72(BGB)--------------------------------------------
END